package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.dao.RangoDAO;
import mx.ipn.to.RangoTO;

public class RangoDAOMySQL implements RangoDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(RangoDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO rango (inicio,fin,porcentaje_sueldo,valor_fijo) VALUES(?,?,?,?)";
	private static final String DELETE = "DELETE FROM rango WHERE id_rango=?";
	private static final String UPDATE = "UPDATE rango SET inicio=?,fin=?,porcentaje_sueldo=?,valor_fijo=? WHERE id_rango=?";
	private static final String FINDBYID = "SELECT * FROM rango WHERE id_rango=?";
	private static final String SELECTBYRANGO = "SELECT * FROM rango WHERE inicio>=? and inicio<=?";
	private static final String SELECT = "SELECT * FROM rango";

	@Override
	public short deleteRango(int idRango) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(DELETE);

			ps.setInt(1, idRango);

			ps.executeUpdate();
			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}

	@Override
	public RangoTO findRangoById(int idRango) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idRango);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {
				double inicio = rs.getFloat("inicio");
				double fin = rs.getFloat("fin");
				double porcentajeSueldo = rs.getFloat("porcentaje_sueldo");
				double valorFijo = rs.getFloat("valor_fijo");

				RangoTO rangoTO = new RangoTO(idRango, inicio, fin,
						porcentajeSueldo, valorFijo);
				ps.close();
				conexion.close();
				return rangoTO;
			}
			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<RangoTO> selectRangoByRango(double inicio, double fin) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECTBYRANGO);
			ps.setDouble(1, inicio);
			ps.setDouble(2, fin);
			ResultSet rs = ps.executeQuery();

			ArrayList<RangoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<RangoTO>();

				int idRango = rs.getInt("id_rango");
				double inicioo = rs.getFloat("inicio");
				double fino = rs.getFloat("fin");
				double porcentajeSueldo = rs.getFloat("porcentaje_sueldo");
				double valorFijo = rs.getFloat("valor_fijo");

				RangoTO rangoTO = new RangoTO(idRango, inicioo, fino,
						porcentajeSueldo, valorFijo);
				coleccion.add(rangoTO);
			}
			ps.close();
			conexion.close();
			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		
	}

	@Override
	public boolean insertRango(RangoTO rangoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setDouble(1, rangoTO.getInicio());
			ps.setDouble(2, rangoTO.getFin());
			ps.setDouble(3, rangoTO.getPorcentajeSueldo());
			ps.setDouble(4, rangoTO.getValorFijo());
			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<RangoTO> selectRango() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			ArrayList<RangoTO> coleccion = null;

			while (rs.next()) {
				if (coleccion == null)
					coleccion = new ArrayList<RangoTO>();

				int idRango = rs.getInt("id_rango");
				double inicio = rs.getFloat("inicio");
				double fin = rs.getFloat("fin");
				double porcentajeSueldo = rs.getFloat("porcentaje_sueldo");
				double valorFijo = rs.getFloat("valor_fijo");

				RangoTO rangoTO = new RangoTO(idRango, inicio, fin,
						porcentajeSueldo, valorFijo);
				coleccion.add(rangoTO);
			}
			ps.close();
			conexion.close();
			return coleccion;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateRango(RangoTO rangoTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setDouble(1, rangoTO.getInicio());
			ps.setDouble(2, rangoTO.getFin());
			ps.setDouble(3, rangoTO.getPorcentajeSueldo());
			ps.setDouble(4, rangoTO.getValorFijo());
			ps.setInt(5, rangoTO.getIdRango());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short)-1;
		}
	}

}
